package com.bbva.gptf.back.servicio.simulacion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.bbva.gptf.back.dominio.SpGeneraOrdenes;
import com.bbva.gptf.back.dominio.SpGeneraOrdenesLayout;
import com.bbva.gptf.back.dominio.SpIntegracion;
import com.bbva.gptf.back.dominio.SpMonto;
import com.bbva.gptf.back.dominio.SpPosicion;
import com.bbva.gptf.back.dominio.SpRecalculo;
import com.bbva.gptf.back.dominio.SpValidaPolitica;
import com.bbva.gptf.back.dominio.Tgpt025Instrumento;
import com.bbva.gptf.back.dominio.Vgpt003Plazo;
import com.bbva.gptf.back.transformador.TransformadorIntegracionToString;
import com.bbva.gptf.back.transformador.TransformadorOrdenesLayoutToString;
import com.bbva.gptf.back.transformador.TransformadorOrdenesToString;
import com.bbva.gptf.back.transformador.TransformadorPlazosSimulacion;
import com.bbva.gptf.back.transformador.TransformadorRestriccionToString;
import com.bbva.gptf.back.transformador.TransformadorSimulacionToString;
import com.bbva.gptf.dto.bean.InstrumentosSimulacion;
import com.bbva.gptf.dto.bean.Integracion;
import com.bbva.gptf.dto.bean.PlazoSimulacion;
import com.bbva.gptf.dto.bean.Validacion;
import com.bbva.gptf.dto.servicio.simulacion.ServicioSimulacion;
import com.bbva.jee.arq.spring.core.httpService.HttpService;

@HttpService(serviceName = "servicioSimulacionHttp")
public class ServicioSimulacionImpl implements ServicioSimulacion {

	// private final I18nLog log =
	// I18nLogFactory.getLogI18n(ServicioSimulacionImpl.class);

	@Autowired
	private SpPosicion spPosicion;

	@Autowired
	private SpMonto spMonto;

	@Autowired
	private SpIntegracion spIntegracion;

	@Autowired
	private SpRecalculo spRecalculo;

	@Autowired
	private SpValidaPolitica spValidaPolitica;

	@Autowired
	private SpGeneraOrdenes spGeneraOrdenes;

	@Autowired
	private SpGeneraOrdenesLayout spGeneraOrdenesLayout;

	@Override
	public boolean generarOrdenes(
			final List<InstrumentosSimulacion> listaPosiciones,
			final boolean restriccion, final BigDecimal cdGestor,
			final String cdUsuario) {
		final TransformadorOrdenesToString transformador = new TransformadorOrdenesToString();
		final String ordenes = transformador.convert(listaPosiciones);
		return spGeneraOrdenes.execute(ordenes, restriccion, cdGestor,
				cdUsuario);
	}

	@Override
	public List<InstrumentosSimulacion> integrar(
			final List<InstrumentosSimulacion> listaPosicion,
			final List<Integracion> listaIntegracion,
			final String tipoOperacion, final Long tipoConsulta,
			final String tipoMercado) {
		final TransformadorSimulacionToString transformadorP = new TransformadorSimulacionToString(false);
		final String instrumentos = transformadorP.convert(listaPosicion);
		final TransformadorIntegracionToString transformadorI = new TransformadorIntegracionToString();
		final String integracion = transformadorI.convert(listaIntegracion);
		return spIntegracion.execute(instrumentos, integracion, tipoOperacion,
				tipoConsulta, tipoMercado);
	}

	@Override
	public List<Integracion> obtieneInstrumentos(final String tipoMercado,
			final String tipoValor, final String emisora, final String serie,
			final Integer plazoMin, final Integer plazoMax) {
		final List<Integracion> lista = new ArrayList<Integracion>();
		final List<Tgpt025Instrumento> entityInstumentos = Tgpt025Instrumento
				.obtieneInstrumentos(tipoMercado, tipoValor, emisora, serie,
						plazoMin.longValue(), plazoMax.longValue());
		Integracion in;
		if (entityInstumentos != null) {
			for (final Tgpt025Instrumento inst : entityInstumentos) {
				in = new Integracion();
				in.setTipoValorBmv(inst.getId().getCdValorBmv());
				in.setEmisora(inst.getId().getCdEmisora());
				in.setSerie(inst.getId().getCdSerie());
				in.setPrecioVector(inst.getImPrecioSucio());
				lista.add(in);
			}
		}
		return lista;
	}

	@Override
	public List<Integracion> obtieneMontos(
			final List<InstrumentosSimulacion> listaPosicion,
			final List<Integracion> listaIntegracion, final String tipoOperacion) {
		final TransformadorSimulacionToString transformadorP = new TransformadorSimulacionToString(false);
		final String instrumentos = transformadorP.convert(listaPosicion);
		final TransformadorIntegracionToString transformadorI = new TransformadorIntegracionToString();
		final String integracion = transformadorI.convert(listaIntegracion);
		return spMonto.execute(instrumentos, integracion, tipoOperacion);
	}

	@Override
	public List<PlazoSimulacion> obtienePlazos(final String tipoValor,
			final String emisora) {
		final List<PlazoSimulacion> listaPlazos = new ArrayList<PlazoSimulacion>();
		if (tipoValor != null && emisora != null) {
			final String tipoValorBmv = tipoValor.trim().toUpperCase();

			final String nombreEmisora = emisora.trim().toUpperCase();
			final TransformadorPlazosSimulacion transformador = new TransformadorPlazosSimulacion();
			final List<Vgpt003Plazo> entityPlazos = Vgpt003Plazo
					.findByTipoValorYEmisora(tipoValorBmv, nombreEmisora);

			if (entityPlazos != null) {
				for (final Vgpt003Plazo ePlazo : entityPlazos) {
					final PlazoSimulacion plazo = transformador.convert(ePlazo);
					listaPlazos.add(plazo);
				}
			}
		}
		return listaPlazos;
	}

	@Override
	public List<InstrumentosSimulacion> obtienePosicion(
			List<InstrumentosSimulacion> lista, final String tipoMercado,
			final String tipoBusqueda, final BigDecimal valor,
			final Long tipoPosicion, final String cdBancomer) {
		final TransformadorSimulacionToString transformador = new TransformadorSimulacionToString(false);
		if (lista == null || lista.size() == 0) {
			lista = new ArrayList<InstrumentosSimulacion>();
			final InstrumentosSimulacion is = new InstrumentosSimulacion();
			is.setCdContrato(0L);
			is.setTpNivel(3L);
			lista.add(is);
		}
		final String cadena = transformador.convert(lista);
		return spPosicion.execute(cadena, tipoMercado, tipoBusqueda, valor,
				tipoPosicion, cdBancomer);
	}

	@Override
	public List<Validacion> obtieneRestricciones(
			final List<InstrumentosSimulacion> listaPosicion,
			final String tipoMercado) {
		final TransformadorRestriccionToString transformadorP = new TransformadorRestriccionToString();
		final String instrumentos = transformadorP.convert(listaPosicion);
		return spValidaPolitica.execute(instrumentos, tipoMercado);
	}

	@Override
	public List<InstrumentosSimulacion> recalculo(final List<InstrumentosSimulacion> listaPosicion,
			final Long tipoConsulta, final Boolean titulosOperar) {
		final TransformadorSimulacionToString transformadorP = new TransformadorSimulacionToString(titulosOperar);
		final String instrumentos = transformadorP.convert(listaPosicion);
		return spRecalculo.execute(instrumentos, tipoConsulta);
	}

	@Override
	public boolean generarOrdenesLayout(final List<InstrumentosSimulacion> listaOrdenes,
			final BigDecimal cdGestor, final String cdUsuario) {
		final TransformadorOrdenesLayoutToString transformador = new TransformadorOrdenesLayoutToString();
		final String ordenes = transformador.convert(listaOrdenes);
		return spGeneraOrdenesLayout.execute(ordenes, listaOrdenes.size(), cdGestor, cdUsuario);
	}

	public void setSpGeneraOrdenes(final SpGeneraOrdenes spGeneraOrdenes) {
		this.spGeneraOrdenes = spGeneraOrdenes;
	}

	public void setSpGeneraOrdenesLayout(final SpGeneraOrdenesLayout spGeneraOrdenesLayout) {
		this.spGeneraOrdenesLayout = spGeneraOrdenesLayout;
	}

	public void setSpIntegracion(final SpIntegracion spIntegracion) {
		this.spIntegracion = spIntegracion;
	}

	public void setSpMonto(final SpMonto spMonto) {
		this.spMonto = spMonto;
	}

	public void setSpPosicion(final SpPosicion spPosicion) {
		this.spPosicion = spPosicion;
	}

	public void setSpRecalculo(final SpRecalculo spRecalculo) {
		this.spRecalculo = spRecalculo;
	}

	public void setSpValidaPolitica(final SpValidaPolitica spValidaPolitica) {
		this.spValidaPolitica = spValidaPolitica;
	}

}
